import {
	getToken,
	setToken,
	removeToken
} from '@/util/auth'
import {
	setStore,
	getStore
} from '@/util/store'
import {
	isURL,
	validatenull
} from '@/util/validate'
import {
	// encryption,
	deepClone
} from '@/util/util'
import webiste from '@/config/website'
import {
	loginByUsername,
	updateDept,
	getUserInfo,
	getMenu,
	getTopMenu,
	refeshToken
} from '@/api/user'

function addPath(ele, first) {
	const menu = webiste.menu;
	const propsConfig = menu.props;
	const propsDefault = {
		label: propsConfig.label || 'name',
		path: propsConfig.path || 'path',
		icon: propsConfig.icon || 'source',
		children: propsConfig.children || 'children'
	}
	const icon = ele[propsDefault.icon];
	ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon;
	const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
	if (isURL(ele[propsDefault.path])) {
		ele[propsDefault.path] = ele[propsDefault.path].replace(/&/g, "$")
	}
	if (!isChild && first && !isURL(ele[propsDefault.path])) {
		ele[propsDefault.path] = ele[propsDefault.path] + '/index'
	} else {
		ele[propsDefault.children] && ele[propsDefault.children].forEach(child => {
			// if (!isURL(child[propsDefault.path])) {
			// 	child[propsDefault.path] =
			// 		`${ele[propsDefault.path]}/${child[propsDefault.path] ? child[propsDefault.path] : 'index'}`
			// }
			addPath(child);
		})
	}
}
const user = {
	state: {
		userInfo: getStore({
			name: 'userInfo'
		}) || [],
		permission: getStore({
			name: 'permission'
		}) || [],
		roles: [],
		menuId: getStore({
			name: 'menuId'
		}) || [],
		menu: getStore({
			name: 'menu'
		}) || [],
		menuAll: getStore({
			name: 'menuAll'
		}) || [],
		token: getStore({
			name: 'token'
		}) || '',
	},
	actions: {
		//根据用户名登录
		LoginByUsername({
			commit
		}, userInfo) {
			// const user = encryption({
			// 	data: userInfo,
			// 	type: 'Aes',
			// 	key: 'avue',
			// 	param: ['useranme', 'password']
			// });
			return new Promise((resolve, reject) => {
				loginByUsername(userInfo.username, userInfo.password, userInfo.code, userInfo.redomStr).then(res => {
					const data = res.data;
					commit('SET_TOKEN', data.data);
					commit('SET_USERINFO', data.remark);
					commit('DEL_ALL_TAG');
					commit('CLEAR_LOCK');
					resolve();
				}).catch(error => {
					reject(error)
				})
			})
		},
		UpdateDept({
			commit
		}, dept) {
			return new Promise((resolve, reject) => {
				updateDept(dept).then(res => {
					const data = res.data;
					commit('SET_TOKEN', data.data);
					commit('SET_USERINFO', data.remark);
					commit('DEL_ALL_TAG');
					commit('CLEAR_LOCK');
					resolve();
				}).catch(error => {
					reject(error)
				})
			})
		},
		//根据手机号登录
		LoginByPhone({
			commit
		}, userInfo) {
			return new Promise((resolve) => {
				loginByUsername(userInfo.phone, userInfo.code).then(res => {
					const data = res.data.data;
					commit('SET_TOKEN', data);
					commit('DEL_ALL_TAG');
					commit('CLEAR_LOCK');
					resolve();
				})
			})
		},
		GetUserInfo({
			commit
		}) {
			return new Promise((resolve, reject) => {
				getUserInfo().then((res) => {
					const data = res.data.data;
					commit('SET_USERINFO', data.userInfo);
					commit('SET_ROLES', data.roles);
					commit('SET_PERMISSION', data.permission)
					resolve(data);
				}).catch(err => {
					reject(err);
				})
			})
		},
		//刷新token
		RefeshToken({
			state,
			commit
		}) {
			return new Promise((resolve, reject) => {
				refeshToken(state.refeshToken).then(res => {
					const data = res.data.data;
					commit('SET_TOKEN', data);
					resolve(data);
				}).catch(error => {
					reject(error)
				})
			})
		},
		// 登出
		LogOut({
			commit
		}) {
			return new Promise((resolve) => {
				// logout().then(() => {
				commit('SET_TOKEN', '')
				commit('SET_MENUID', {})
				commit('SET_MENUALL', []);
				commit('SET_MENU', [])
				commit('SET_ROLES', [])
				commit('DEL_ALL_TAG');
				commit('CLEAR_LOCK');
				removeToken()
				resolve()
				// }).catch(error => {
				// 	reject(error)
				// })
			})
		},
		//注销session
		FedLogOut({
			commit
		}) {
			return new Promise(resolve => {
				commit('SET_TOKEN', '')
				commit('SET_MENUID', {})
				commit('SET_MENUALL', []);
				commit('SET_MENU', [])
				commit('SET_ROLES', [])
				commit('DEL_ALL_TAG');
				commit('CLEAR_LOCK');
				removeToken()
				resolve()
			})
		},
		GetTopMenu() {
			return new Promise(resolve => {
				getTopMenu().then((res) => {
					const data = res.data.data || []
					resolve(data)
				})
			})
		},
		//获取系统菜单
		GetMenu({
			commit
		}, parentId) {
			return new Promise(resolve => {
				getMenu(parentId).then((res) => {
					const data = res.data.data
					commit('SET_PERMISSION', data.btnList);
					let menu = deepClone(data.menuList);
					menu.forEach(ele => {
						addPath(ele, true);
					})
					commit('SET_MENU', menu)
					resolve(menu)
				})
			})
		},
	},
	mutations: {
		SET_TOKEN: (state, token) => {
			setToken(token)
			state.token = token;
			setStore({
				name: 'token',
				content: state.token,
				type: 'session'
			})
		},
		SET_MENUID(state, menuId) {
			state.menuId = menuId;
			setStore({
				name: 'menuId',
				content: state.menuId,
				type: 'session'
			})
		},
		SET_USERINFO: (state, userInfo) => {
			state.userInfo = userInfo;
			setStore({
				name: 'userInfo',
				content: state.userInfo
			})
		},
		SET_MENUALL: (state, menuAll) => {
			state.menuAll = menuAll
			setStore({
				name: 'menuAll',
				content: state.menuAll,
				type: 'session'
			})
		},
		SET_MENU: (state, menu) => {
			state.menu = menu
			let menuAll = state.menuAll;
			if (!validatenull(menu)) {
				const obj = menuAll.filter(ele => ele.path === menu[0].path)[0]
				if (!obj) {
					menuAll = menuAll.concat(menu);
					state.menuAll = menuAll
				}
				setStore({
					name: 'menuAll',
					content: state.menuAll,
					type: 'session'
				})
			}
			setStore({
				name: 'menu',
				content: state.menu,
				type: 'session'
			})
		},
		SET_ROLES: (state, roles) => {
			state.roles = roles;
		},
		SET_PERMISSION: (state, permission) => {
			let result = [];

			function getCode(list) {
				list.forEach(ele => {
					if (typeof(ele) === 'object') {
						const chiildren = ele.children;
						const code = ele.code;
						if (chiildren) {
							getCode(chiildren)
						} else {
							result.push(code);
						}
					}
				})
			}
			getCode(permission);
			state.permission = {};
			result.forEach(ele => {
				state.permission[ele] = true;
			});
			// state.permission = {};
			// permission.forEach(ele => {
			// 	state.permission[ele] = true;
			// });
			// console.log(state.permission)
			setStore({
				name: 'permission',
				content: state.permission,
				type: 'session'
			})
		}
	}

}
export default user
